    /*$RCSfile: validateUtilities.js,v $ $Revision: 1.1 $ $Date: 2007/02/08 21:04:32 $ */

  /**
  * This is a place holder for common utilities used across the javascript validation
  *
  **/
  
	 /**
	 * Trims the string
	 *
	 */
	  function trim(str) {
		return str.replace(/^\s*/, "" ).replace(/\s*$/, "" );
	  }
	 
    
  
   /**
   * Verifica se tem um atributo com determinado valor no request do action
   */
   function hasAtribute(atributos,valores, action, form, field){
       
       //Constroi Array de nomes dos atributos e de valores esperados para atributos
       var names = atributos.split(","); 
       var values = valores.split(",");

       //Se tem um nome de atributo e nao tem valor, retorna falso
       if (values.length<=i) 
           return false;

       //Para cada nome de atributo verifica se possui o valor esperado
       var name, atrib;
       for (var i = 0; i < names.length; i++) {
           name = names[i].trim();
           
           //Recebe atributos
           var atribValues =getValoresAtributos(name, action, form);
           
           //Se n?o tem valor para atributo
           if (!atribValues || atribValues.length == 0)
               return false;
           if(!contemAtributo(atribValues, values[i].split(';')) )
               return false;
        }
        return true;
    }
  
    function getValoresAtributos(name, action, form){
       //Pega valores do atributo no form
       var campos = createCampos(form[name]);
       var valores= new Array();

       for (var i = 0; i < campos.length; i++) {
           valores.push(campos[i].valor)
       }

       //Pega valores do action do form
       var aux = action;
       var posini = aux.indexOf(name+"=");        
       while(posini >= 0){
           aux = aux.substring(posini + name.length + 1);
           valores.push( aux.substring(0,((aux.indexOf("&")>-1)? aux.indexOf("&"): aux.length)));
           posini = aux.indexOf(name+"=");
       }
       
       return valores;
   }

    //Dado um array de valores de atributos(atribValues) e um array de valores, verifica se qualquer elemento de um array pertence ao outro array
    function contemAtributo(atribValues, values){
        for (var i = 0; i < values.length; i++) {
            for (var j = 0; j < atribValues.length; j++) {
                if(values[i] == atribValues[j] || values[j] =="*")
                   return true;  
            } 
        }
        return false;
    }
    
    
     /**
    * Povoa o array campos com todos os valores, n?o vazios, encontrados.
    * Cada indice do array campos tem um Objeto Campo
    * @param campos Array vazio que ser? preenchido.
    * @param field Filed que tem o valor (es) a ser colocado em campos
    */
    function extractValues(campos, field){
            if (field && field.disabled == false){
                if (field.type == 'hidden' ||
                    field.type == 'text' ||
                    field.type == 'textarea' ||
                    field.type == 'file' ||
                    field.type == 'checkbox' ||
                    field.type == 'radio' ||
                    field.type == 'select-one' ||
                    field.type == 'password') {

                    // get field's value
                    if (field.type == "select-one") {
                        var si = field.selectedIndex;
                        if (si >= 0) {
                            addValue(campos, field.options[si].value, field);
                        }
                    } else if (field.type == 'checkbox' || field.type == 'radio') {
                        if (field.checked) {
                            addValue(campos, field.value, field);
                        }
                    } else {
                        addValue(campos, field.value, field);
                    }
                } else if (field.type == "select-multiple") { 
                    var numOptions = field.options.length;
                    for(loop=numOptions-1;loop>=0;loop--) {
                        if(field.options[loop].selected) {
                            addValue(campos, field.options[loop].value, field);
                        }
                    }
                }
            }
    }
    
    
    /**
     * Com um valor, um field se cria um Objeto campo e adiciona no array campos dado
     *
     */
    function addValue(campos, value, field){
        if (field && value && value.trim().length > 0){
            campos.push(new Campo(field, value));
        }
    }
    
    /**
     * Cria um array de Campos com todos os valores que tem em "fields".
     * fields pode ser um campo ou varios campos
     */
    function createCampos(fields){
        var campos = new Array();
        if (fields){
            var tamanho = fields.length;
            
            if (tamanho && fields.type != "select-one" && fields.type != "select-multiple"){
                for (j=0;j<tamanho;j++){
                    var f = fields[j];
                    extractValues(campos, f);
                }
            } else {
                    extractValues(campos, fields);
            }
        }
        return campos;
    }
    
        /**
     * Objeto que cria o par Field e seu Valor
     * Um field pode ter varios valores
     */
    function Campo(field, valor) { 
        this.campo = field;
        this.valor = valor;
    } 
    
     function testValues(notValue, valores){
    
    	if (!notValue)
    		return valores.length <= 0;
    		
    	for (var j = 0; j < valores.length; j++){
			if (valores[j].valor == notValue)
				return true;
    	}
		return false;
    }
    
      /**
     * Recupera o primeiro campo encontrado
     */
    function firstField(fields){
        if (fields){
            var tamanho = fields.length;
            if (tamanho && tamanho > 0 && fields.type != "select-one" && fields.type != "select-multiple"){
                return fields[0];
            } else {
                return fields;
            }
        }
    }
    
   function setFocus(focusControl){
	    if (focusControl &&
	    	 focusControl.type != "hidden" &&
	    	 !focusControl.disabled) {
    	 focusControl.focus();
	  }
  	}
    
     function alerte(mens){
    	var text = "";
        if(mens && mens.length >0){
        	if (mens.length > 1){
           		text = mens.join('\n');
            } else {
           		text = mens[0];
            }
            alert(text);
        }
    }
    
     function validInteger(value){
        if (value.length > 0) {
            if (!isAllDigits(value)) {
                return false
            } else {
                var iValue = parseInt(value);
                if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                    return false;
                }
            }
        }
        return true;
    }

    function isAllDigits(argvalue) {
        argvalue = argvalue.toString();
        var validChars = "0123456789";
        var startFrom = 0;
        if (argvalue.substring(0, 2) == "0x") {
           validChars = "0123456789abcdefABCDEF";
           startFrom = 2;
        } else if (argvalue.charAt(0) == "0") {
           validChars = "01234567";
           startFrom = 1;
        } else if (argvalue.charAt(0) == "-") {
            startFrom = 1;
        }

        for (var n = startFrom; n < argvalue.length; n++) {
            if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
        }
        return true;
    }
    
    
    
    function validMaxLength(value, max){
       if (value && tamanho(value) > max) {
           return false;
       }
        return true;
    }
    
    function tamanho(value){
    	var resp = value;
    	return resp.length;
    }
    
    
    function isValidDate(day, month, year) {
	    if (month < 1 || month > 12) {
            return false;
        }
        if (day < 1 || day > 31) {
            return false;
        }
        if ((month == 4 || month == 6 || month == 9 || month == 11) &&
            (day == 31)) {
            return false;
        }
        if (month == 2) {
            var leap = (year % 4 == 0 &&
               (year % 100 != 0 || year % 400 == 0));
            if (day>29 || (day == 29 && !leap)) {
                return false;
            }
        }
        return true;
    }